package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;

import model.Conjunto;
import model.Producto;
import view.ProductoView;

public class AdministradorPersistenciaConjunto extends AdministradorPersistencia{
	
	private static AdministradorPersistenciaConjunto apc;
	
	String queryInsertar = "insert into productos (nombre,precio,tipo,estacion,descuento,stock,estado) values (?,?,'CONJUNTO','N/A',?,?,'ACTIVO')";
	String queryInsertarProducto = "insert into conjuntos_productos values (?,?)";
	String queryBuscar = "select * from productos where codigoProducto=?";
	String queryBuscarProductos = "select codigoProducto from conjuntos_productos where codigoConjunto=?";
	String queryView = "select * from productos where estado='ACTIVO' and tipo='CONJUNTO'";
	String queryEliminar = "update productos set estado='INACTIVO' where codigoProducto=?";
	String queryEliminarProductos = "delete from conjuntos_productos where codigoConjunto=?";
	String queryUpdate = "update productos set nombre=?,precio=?,descuento=? where codigoProducto=?";
	
	public static AdministradorPersistenciaConjunto getInstance() {
		if(apc == null){
			apc = new AdministradorPersistenciaConjunto();
		}
		return apc;
	}
	
	public int insertarConjunto(String nombre, float descuento, int stock, float precio, Vector<String> listaProductos){
		try{
			Connection con = getConnection();
			PreparedStatement ps = con.prepareStatement(queryInsertar,Statement.RETURN_GENERATED_KEYS);
			ps.setString(1, nombre);
			ps.setFloat(2, precio);
			ps.setFloat(3, descuento);
			ps.setInt(4, stock);
			int rc = ps.executeUpdate();
			int codigoConjunto = 0;
			if (rc > 0){
				ResultSet key = ps.getGeneratedKeys();
				if (key.next()){
					codigoConjunto = key.getInt(1);
				}
				for (String codigoProducto: listaProductos){
					ps = con.prepareStatement(queryInsertarProducto);
					ps.setInt(1, codigoConjunto);
					ps.setInt(2, Integer.valueOf(codigoProducto));
					ps.execute();
				}
			}
			con.close();
			return codigoConjunto;
		}
		catch(Exception e){
			e.printStackTrace();
			return 0;
		}
	}

	public boolean actualizarConjunto(Conjunto c){
		/*
		 * Devuelve verdadero si pudo actualizar todos los campos
		 * Caso contrario, devuelve falso
		 */
		try{
			con = getConnection();
			PreparedStatement ps = con.prepareStatement(queryUpdate); 
			ps.setString(1, c.getNombre());
			ps.setFloat(2, c.getPrecio());
			ps.setFloat(3, c.getDescuento());
			ps.setInt(4, c.getCodigo());
			ps.execute();
			ps = con.prepareStatement(queryEliminarProductos);
			ps.setInt(1, c.getCodigo());
			ps.execute();
			for (Producto p: c.getProductos()){
				ps = con.prepareStatement(queryInsertarProducto);
				ps.setInt(1, c.getCodigo());
				ps.setInt(2, p.getCodigo());
				ps.execute();
			}
			con.close();
			return true;
		}
		catch(Exception e){
			e.printStackTrace();
			return false;
		}
	}

	public boolean eliminarConjunto(int codigo) {
		try{
			con = getConnection();
			PreparedStatement ps = con.prepareStatement(queryEliminar);
			ps.setInt(1, codigo);
			ps.execute();
			con.close();
			return true;
		}
		catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
	
	public Conjunto buscarConjunto(int codigo) {
		try {
			con = super.getConnection();
			PreparedStatement ps = con.prepareStatement(queryBuscar);
			ps.setInt(1, codigo);
			ResultSet rs = ps.executeQuery();
			Conjunto c = null;
			while(rs.next()){
				c = new Conjunto(
						rs.getString("nombre"),
						rs.getFloat("descuento"),
						rs.getInt("Stock")
						);
				c.setCodigo(codigo);
				ps = con.prepareStatement(queryBuscarProductos);
				ps.setInt(1, codigo);
				rs = ps.executeQuery();
				while (rs.next()){
					Producto p = AdministradorPersistenciaProducto.getInstance().buscarProducto(
							Integer.valueOf(rs.getString("codigoProducto"))
							);
					if (p != null)
						c.agregarProducto(p);
				}
			}
			con.close();
			return c;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public Vector<ProductoView> obtenerVistaConjuntos() throws Exception {
		Vector<ProductoView> lista = new Vector<ProductoView>();
		Connection con = super.getConnection();
		PreparedStatement ps = con.prepareStatement(queryView);
		ResultSet rs = ps.executeQuery();
		while (rs.next()){
			ProductoView p = new ProductoView(
					rs.getInt("codigoProducto"),
					rs.getString("nombre"),
					rs.getFloat("precio"),
					rs.getInt("stock"),
					rs.getString("tipo"),
					rs.getString("estacion")
					);
			lista.add(p);
		}
		con.close();
		return lista;
	}

}
